package com.pengshun.modules.api.huanxin.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.pengshun.modules.api.coal.util.CommonUtil;
import com.pengshun.modules.api.coal.util.SystemPath;
import com.pengshun.modules.api.huanxin.service.HuanXinService;
import com.pengshun.modules.api.huanxin.service.domain.HuanXinChatfiles;
import com.pengshun.modules.api.huanxin.service.domain.HuanXinToken;
import com.pengshun.modules.api.huanxin.service.domain.HuanxinCommon;
import com.pengshun.modules.common.BaseResult;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;

import java.util.Collections;
import java.util.concurrent.TimeUnit;

/**
 * @author luoligang
 * @create 2021/4/19
 */
@Service
@RequiredArgsConstructor
public class HuanXinServiceImpl implements HuanXinService {

    private final RestTemplate restTemplate;
    private final RedisTemplate<String, String> redisTemplate;

    @Override
    public BaseResult getToken() {
        //先从redis 拿token  没有在拿新的token
        String token=(String) redisTemplate.boundValueOps(SystemPath.SYSTEM_HUANXIN_TOKEN_PATH).get();
        BaseResult result= new BaseResult(0);
        if(token!=null&&!"".equals(token)){
            result.setJwtToken(token);
            return result;
        }
        //请求地址
        String url = HuanxinCommon.url+ "/token";
        JSONObject jsonObject = new JSONObject();
        //请求参数
        jsonObject.put("grant_type", "client_credentials");
        jsonObject.put("client_id", HuanxinCommon.clientId);
        jsonObject.put("client_secret", HuanxinCommon.clientSecret);
        HttpHeaders headers = new HttpHeaders();
        HttpEntity<JSONObject> httpEntity = new HttpEntity<JSONObject>(jsonObject, headers);
        ResponseEntity<HuanXinToken> response2 = restTemplate.postForEntity(url, httpEntity, HuanXinToken.class);
        System.out.println(response2.getBody());
        HttpStatus code=response2.getStatusCode();
        if(code.value()==200){
            HuanXinToken res =response2.getBody();
            result.setJwtToken(res.getAccess_token());
            redisTemplate.delete(SystemPath.SYSTEM_HUANXIN_TOKEN_PATH );
            //设置有效期5分钟
            redisTemplate.boundValueOps(SystemPath.SYSTEM_HUANXIN_TOKEN_PATH ).set(res.getAccess_token(), res.getExpires_in()/60, TimeUnit.MINUTES);
            return result;
        }
        return new BaseResult(1,"error");

        // 系统不保证 token 在此值表示的有效期内绝对有效，如果发现 token 使用异常请重新获取新的 token，比如“http response code”返回 401。
        // 另外，请不要频繁向服务器发送获取 token 的请求，同一账号发送此请求超过一定频率会被服务器封号，切记，切记！！

    }

    @Override
    public BaseResult resgtionUser(Long userId,String nickname) {
        //请求地址
        String url = HuanxinCommon.url+ "/users";
        JSONObject jsonObject = new JSONObject();
        //请求参数
        jsonObject.put("username", "bmtuserhx"+userId);
        jsonObject.put("password","bmtuserhx666");
        jsonObject.put("nickname", nickname);
        HttpHeaders headers = new HttpHeaders();
        //头部携带token
        headers.add("Authorization","Bearer "+getToken().getJwtToken());
        HttpEntity<JSONObject> httpEntity = new HttpEntity<JSONObject>(jsonObject, headers);
        ResponseEntity<Object> response2 = restTemplate.postForEntity(url, httpEntity, Object.class);
        HttpStatus code=response2.getStatusCode();
        if(code.value()==200){
            //返回值200，表示创建 IM 用户成功
            System.err.println("success ");
            System.err.println(response2.getBody());
            return  new BaseResult(0,response2.getBody());
        }
        JSONObject res = (JSONObject) response2.getBody();
        if(code.value()==400){
            //返回值400，表示用户已存在、用户名或密码为空、用户名不合法
            System.err.println(res.get("error_description"));
            return  new BaseResult(1, res.get("error"));
        }
        if(code.value()==401){
            //返回值401，表示未授权[无token、token错误、token过期]
            System.err.println(res.get("error_description"));
            return  new BaseResult(1, res.get("error"));
        }
        System.err.println("error ");
        return new BaseResult(1,"error");
    }

    @Override
    public BaseResult sendTextMessage(String users[], String msg, String from) {
        //发送文本消息
        //请求地址
        String url = HuanxinCommon.url+ "/messages";
        JSONObject jsonObject = new JSONObject();
        //请求参数
        //target_type	发送的目标类型；users：给用户发消息，chatgroups：给群发消息，chatrooms：给聊天室发消息
        jsonObject.put("target_type", "users");
        //target 发送的目标；注意这里需要用数组，数组内添加的最大用户数默认600个，即使只有一个用户，也要用数组 ['u1']；给用户发送时数组元素是用户名，给群组发送时，数组元素是groupid
        jsonObject.put("target",users);
        JSONObject json= new JSONObject();
        //type	消息类型；txt:文本消息，img：图片消息，loc：位置消息，audio：语音消息，video：视频消息，file：文件消息
        json.put("type", "txt");
        //msg	消息内容
        json.put("txt", "msg");
        jsonObject.put("msg", json);
        //from	表示消息发送者;无此字段Server会默认设置为“from”:“admin”，有from字段但值为空串(“”)时请求失败
        jsonObject.put("from", "from");
        HttpHeaders headers = new HttpHeaders();
        //头部携带token
        headers.add("Authorization","Bearer "+getToken().getJwtToken());
        HttpEntity<JSONObject> httpEntity = new HttpEntity<JSONObject>(jsonObject, headers);
        ResponseEntity<Object> response2 = restTemplate.postForEntity(url, httpEntity, Object.class);
        HttpStatus code=response2.getStatusCode();
        if(code.value()==200){
            //返回值200，表示消息发送成功
            System.err.println("success ");
            System.err.println(response2.getBody());
            return  new BaseResult(0,response2.getBody());
        }
        JSONObject res = (JSONObject) response2.getBody();
        if(code.value()==400){
            //返回值400，表示 massage 结构错误
            System.err.println(res.get("error_description"));
            return  new BaseResult(1, res.get("error"));
        }
        if(code.value()==401){
            //返回值401，表示未授权[无token、token错误、token过期]
            System.err.println(res.get("error_description"));
            return  new BaseResult(1, res.get("error"));
        }
        System.err.println("error ");
        return new BaseResult(1,"error");
    }

    @Override
    public BaseResult sendPicMessage(String msg) {
        //target_type	发送的目标类型；users：给用户发消息，chatgroups：给群发消息，chatrooms：给聊天室发消息
        //target	发送的目标；注意这里需要用数组，数组内添加的最大用户数默认600个，即使只有一个用户，也要用数组 ['u1']；给用户发送时数组元素是用户名，给群组发送时，数组元素是groupid
        //msg	消息内容
        //type	消息类型；txt:文本消息，img：图片消息，loc：位置消息，audio：语音消息，video：视频消息，file：文件消息
        //url	域名/orgname/appname/chatfiles/成功上传文件返回的UUID。参考请求示例
        //filename	图片名称
        //secret	成功上传文件后返回的secret
        //size	图片尺寸；height：高度，width：宽度
        //from	表示消息发送者;无此字段Server会默认设置为“from”:“admin”，有from字段但值为空串(“”)时请求失败
        //curl    -H 'Authorization: Bearer YWMtsFVigGSuEeSTc7k5183Z5QAAAUqzeFx_9IjRch-ZxNbIlBIvx_4GWvzheSU'  -d '{"target_type":"users","target":["user2"],"from":"user1","msg":{"type":"img","filename":"testimg.jpg","secret":"VfEpSmSvEeS7yU8dwa9rAQc-DIL2HhmpujTNfSTsrDt6eNb_","url":"https://a1.easemob.com/easemob-demo/testapp/chatfiles/55f12940-64af-11e4-8a5b-ff2336f03252","size":{"width":480,"height":720}}}'
        //可能返回的结果示例
        //返回值200，表示消息发送成功
        //返回值400，表示 massage 结构错误
        //返回值401，表示未授权[无token、token错误、token过期]

        //请求地址
//        String url = HuanxinCommon.url+ "/messages";
//        JSONObject jsonObject = new JSONObject();
//        //请求参数
//        //target_type	发送的目标类型；users：给用户发消息，chatgroups：给群发消息，chatrooms：给聊天室发消息
//        jsonObject.put("target_type", "users");
//        //target 发送的目标；注意这里需要用数组，数组内添加的最大用户数默认600个，即使只有一个用户，也要用数组 ['u1']；给用户发送时数组元素是用户名，给群组发送时，数组元素是groupid
//        jsonObject.put("target",users);
//        JSONObject json= new JSONObject();
//        //type	消息类型；txt:文本消息，img：图片消息，loc：位置消息，audio：语音消息，video：视频消息，file：文件消息
//        json.put("type", "txt");
//        //msg	消息内容
//        json.put("txt", "msg");
//        jsonObject.put("msg", json);
//        //from	表示消息发送者;无此字段Server会默认设置为“from”:“admin”，有from字段但值为空串(“”)时请求失败
//        jsonObject.put("from", "from");
//        HttpHeaders headers = new HttpHeaders();
//        //头部携带token
//        headers.add("Authorization","Bearer "+getToken().getJwtToken());
//        HttpEntity<JSONObject> httpEntity = new HttpEntity<JSONObject>(jsonObject, headers);
//        ResponseEntity<Object> response2 = restTemplate.postForEntity(url, httpEntity, Object.class);
//        HttpStatus code=response2.getStatusCode();
//        if(code.value()==200){
//            //返回值200，表示消息发送成功
//            System.err.println("success ");
//            System.err.println(response2.getBody());
//            return  new BaseResult(0,response2.getBody());
//        }
//        JSONObject res = (JSONObject) response2.getBody();
//        if(code.value()==400){
//            //返回值400，表示 massage 结构错误
//            System.err.println(res.get("error_description"));
//            return  new BaseResult(1, res.get("error"));
//        }
//        if(code.value()==401){
//            //返回值401，表示未授权[无token、token错误、token过期]
//            System.err.println(res.get("error_description"));
//            return  new BaseResult(1, res.get("error"));
//        }
//        System.err.println("error ");
        return new BaseResult(1,"error");
    }

    @Override
    public BaseResult sendAudioMessage(String msg) {
        return null;
    }

    @Override
    public BaseResult sendVideoMessage(String msg) {
        return null;
    }

    @Override
    public BaseResult sendLocMessage(String msg) {
        return null;
    }

    @Override
    public BaseResult upChatfiles(MultipartFile avatar) {
        //请求地址
        String url = HuanxinCommon.url+ "/chatfiles";
        HttpHeaders headers = new HttpHeaders();
        MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
        form.add("file", avatar); //这里file是取决于 接收端取文件的字段定义是什么。
        headers.setAccept(Collections.singletonList(MediaType.MULTIPART_FORM_DATA));
        //头部携带token
        headers.add("Authorization","Bearer "+getToken().getJwtToken());
        headers.add("restrict-access","true");
        HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);
        ResponseEntity<HuanXinChatfiles> response2=restTemplate.postForEntity(url, files, HuanXinChatfiles.class);
        HttpStatus code=response2.getStatusCode();
        if(code.value()==200){
            //返回值200，表示成功
            System.err.println("success ");
            System.err.println(response2.getBody());
            return  new BaseResult(0,response2.getBody());
        }
        HuanXinChatfiles chatfiles=response2.getBody();
        System.err.println(chatfiles.getError_description());
        return  new BaseResult(1, chatfiles.getError());
    }
}
